package site.addzero.cli.autoinit.common

import kotlinx.coroutines.runBlocking
import org.koin.core.annotation.Single
import org.koin.core.context.GlobalContext.startKoin
import org.koin.ksp.generated.defaultModule
import site.addzero.cli.platform.PlatformTools
import site.addzero.cli.platform.PlatformType
import site.addzero.task.InitTask
import java.io.File


fun main() {
    val startKoin = startKoin {
        modules(defaultModule)
    }
    runBlocking {
        AutoInitIdea().asynctask()
    }
}

/**
 * IntelliJ IDEA 自动初始化类
 * 负责配置 IntelliJ IDEA 的配置文件，将插件和配置目录指向家目录
 */
@Single
class AutoInitIdea : InitTask {
    override val support: Boolean = true

    /**
     * 执行 IntelliJ IDEA 初始化任务
     */
    override suspend fun asynctask(): Boolean {
        println("正在配置 IntelliJ IDEA (XDG 规范)...")
        
        // 获取用户主目录
        val homeDir = PlatformTools.getHomeDir()
        
        // 定义可能的 IntelliJ IDEA 配置文件路径
        val ideaPropertiesPaths = when (PlatformTools.getPlatformType()) {
            PlatformType.MACOS -> listOf(
                "$homeDir/Applications/IntelliJ IDEA Ultimate.app/Contents/bin/idea.properties",
                "$homeDir/Applications/IntelliJ IDEA.app/Contents/bin/idea.properties",
                "/Applications/IntelliJ IDEA.app/Contents/bin/idea.properties",
                "/Applications/IntelliJ IDEA Ultimate.app/Contents/bin/idea.properties"
            )
            PlatformType.WINDOWS -> {
                // Windows 上的典型路径
                val programFiles = System.getenv("ProgramFiles") ?: "C:\\Program Files"
                val programFilesX86 = System.getenv("ProgramFiles(x86)") ?: "C:\\Program Files (x86)"
                
                listOf(
                    "$programFiles\\JetBrains\\IntelliJ IDEA\\bin\\idea.properties",
                    "$programFilesX86\\JetBrains\\IntelliJ IDEA\\bin\\idea.properties",
                    "$programFiles\\JetBrains\\IntelliJ IDEA Community Edition\\bin\\idea.properties",
                    "$programFilesX86\\JetBrains\\IntelliJ IDEA Community Edition\\bin\\idea.properties",
                    "$programFiles\\JetBrains\\IntelliJ IDEA Ultimate\\bin\\idea.properties",
                    "$programFilesX86\\JetBrains\\IntelliJ IDEA Ultimate\\bin\\idea.properties"
                )
            }
            else -> emptyList() // Linux 等其他平台暂不处理
        }
        
        // 查找存在的配置文件
        val existingPropertiesFile = ideaPropertiesPaths.find { PlatformTools.fileExists(it) }
        
        if (existingPropertiesFile != null) {
            println("找到 IntelliJ IDEA 配置文件: $existingPropertiesFile")
            modifyIdeaProperties(existingPropertiesFile)
        } else {
            println("未找到 IntelliJ IDEA 配置文件，跳过配置")
        }
        
        return true
    }

    /**
     * 修改 IntelliJ IDEA 的配置文件
     * @param propertiesFilePath 配置文件路径
     */
    private fun modifyIdeaProperties(propertiesFilePath: String) {
        try {
            // 读取现有配置文件内容
            val fileContent = PlatformTools.readFile(propertiesFilePath)
            val lines = fileContent.lines().toMutableList()
            
            // 定义要修改的配置项 (遵循用户期望的 XDG 规范)
            val configPathLine = "idea.config.path=\${user.home}/.config/IntelliJIdea/config"
            val pluginsPathLine = "idea.plugins.path=\${idea.config.path}/plugins"
            
            // 跟踪是否已经找到并修改了配置项
            var configPathFound = false
            var pluginsPathFound = false
            
            // 遍历所有行，查找并替换我们需要的配置
            for (i in lines.indices) {
                val line = lines[i].trim()
                
                // 检查是否包含 idea.config.path 配置（不论是否注释）
                if (line.contains("idea.config.path=")) {
                    lines[i] = configPathLine
                    configPathFound = true
                }
                // 检查是否包含 idea.plugins.path 配置（不论是否注释）
                else if (line.contains("idea.plugins.path=")) {
                    lines[i] = pluginsPathLine
                    pluginsPathFound = true
                }
            }
            
            // 如果没有找到配置项，则添加它们（避免重复添加）
            if (!configPathFound) {
                lines.add(configPathLine)
            }
            if (!pluginsPathFound) {
                lines.add(pluginsPathLine)
            }
            
            // 将修改后的内容写回文件
            val modifiedContent = lines.joinToString("\n")
            PlatformTools.writeFile(propertiesFilePath, modifiedContent)
            
            println("IntelliJ IDEA 配置文件修改完成 (XDG 规范)")
        } catch (e: Exception) {
            println("修改 IntelliJ IDEA 配置文件时出错: ${e.message}")
        }
    }
}